package com.mouliu.base.syn08;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
 *
 * 与CountDownLatch的第一次交互是主线程等待其他线程。主线程必须在启动其他线程后立即调用CountDownLatch.await()方法。这样主线程的操作就会在这个方法上阻塞，直到其他线程完成各自的任务。
 * wait notfiy 方法，wait释放锁，notfiy不释放锁
 * @author liu.mou
 */
public class ListAdd2 {
    private volatile static List list = new ArrayList<>();

    public void add(){
        list.add("bjsxt");
    }
    public int size(){
        return  list.size();
    }
    public static  void main(String[] args){
        final ListAdd2 list2 = new ListAdd2();
        // 1 实例化出来一个 lock
        // 当使用wait 和 notify 的时候 ， 一定要配合着synchronized关键字去使用
//        final Object lock = new Object();
        final CountDownLatch countDownLatch = new CountDownLatch(1);

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
//                    synchronized (lock){
                        for (int i=0;i<10;i++){
                            list2.add();
                            System.out.println("当前线程：" + Thread.currentThread().getName() + "添加了一个元素..");
                            Thread.sleep(500);
                            if (list2.size()==5){
                                System.out.println("已经发出通知..");
                                countDownLatch.countDown();
//                                lock.notify();
                            }
                        }
//                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"t1");

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
//               synchronized (lock){
                   if (list2.size()!=5){
                       try {
//                          System.out.println("t2进入");
//                           lock.wait();
                           countDownLatch.await();
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                   }
                   System.out.println("当前线程：" + Thread.currentThread().getName() + "收到通知线程停止..");
                   throw new RuntimeException();
               }
//            }
        },"t2");
        t1.start();
        t2.start();
    }
}
